package com.second.app.huaweiod;


/**
 * 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
 *
 * 请你将两个数相加，并以相同形式返回一个表示和的链表。
 *
 * 你可以假设除了数字 0 之外，这两个数都不会以 0 开头
 */
public class ListNodeDemo {


    public static void main(String args[]) {
        // 构造测试链表
        int[] arr1 = {9, 9, 9, 9, 9, 9, 9};
        int[] arr2 = {9, 9, 9, 9};

        ListNode l1 = buildList(arr1);
        ListNode l2 = buildList(arr2);

        // 调用加法方法
        ListNode result = add2Numbers(l1, l2);

        // 打印结果
        System.out.println("result: "+result);

    }

    public static ListNode buildList(int[] nums) {
        ListNode dummy = new ListNode(0);
        ListNode curr = dummy;
        for (int n : nums) {
            curr.next = new ListNode(n);
            curr = curr.next;
        }
        return dummy.next;
    }


    public static ListNode add2Numbers(ListNode a, ListNode b) {


        ListNode dummy = new ListNode(0);// 先创建一个假节点

        ListNode curr = dummy;

        int carry = 0; // 进位


        while (a != null || b != null || carry != 0) {

            int x = a != null ? a.val : 0;
            int y = b != null ? b.val : 0;

            int sum = x + y + carry;

            carry = sum / 10; // 进位

            int digist = sum % 10;//链表值

            ListNode nextNode = new ListNode(digist);

            curr.next = nextNode;
            curr = curr.next; // 赋值当前节点的值。
            if (a != null) {
                a = a.next;
            }
            if (b != null) {
                b = b.next;
            }
        }

        return dummy.next;
    }
}
